import java.util.HashSet;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-08-30
 * Time: 22:47
 */
public class Solution {

    // 方法一: 使用 哈希表检测是否数字出现过
    public boolean isHappy1(int n) {
        HashSet<Integer> set = new HashSet<>();
        while (n != 1 && !set.contains(n)) {
            set.add(n);
            n = getNext(n);
        }
        return n == 1;
    }

//     方法二: 快慢指针
//     fast 一次走两步, slow 一次走一步
//     如果能到达 1, 那么 fast 一定比 slow 先到达 1, 因为 到达 1 之后就一直是 1, fast 不会跳过
//     如果不能到达, 那么就是有环, 如何判断是否有环? 快慢指针嘛, 有环的话最终 fast 与 slow 会相遇
    public boolean isHappy2(int n) {
        int fast = n;
        int slow = n;
        while (fast != 1) {
            slow = getNext(slow);
            fast = getNext(getNext(fast));
            if (slow == fast) {
                break;
            }
        }
        return fast == 1;
    }

    private int getNext(int n) {
        int sum = 0;
        while (n > 0) {
            int val = n % 10;
            sum += val*val;
            n /= 10;
        }
        return sum;
    }


}
